/*
 * Funambol is a mobile platform developed by Funambol, Inc. 
 * Copyright (C) 2008 Funambol, Inc.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission 
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE 
 * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License 
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 * 
 * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite 
 * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
 * 
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * 
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by Funambol" logo. If the display of the logo is not reasonably 
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by Funambol".
 */

#include "NoteChangesTracker.h"
#include "base/Log.h"


NoteChangesTracker::NoteChangesTracker(const char* cpath){
    
    path = cpath;
    newKeys = NULL;
    updatedKeys = NULL;
    deletedKeys = NULL;
    allKeys     = NULL;
 
}

NoteChangesTracker::~NoteChangesTracker(){
    delete newKeys; newKeys = NULL;
    delete updatedKeys; updatedKeys = NULL;
    delete deletedKeys; deletedKeys = NULL;
    delete allKeys; allKeys = NULL;
}

void NoteChangesTracker::getAll(){

    SQLiteDriver driver(path);
    LOG.debug("getall1");
    ArrayList tmp;
    StringBuffer query;
    query.append("SELECT ROWID FROM Note;");
    int ret = driver.queryIndex(query, tmp);
    if(ret != 0){
        LOG.debug("NoteChangesTracker getAll error");
    }
    LOG.debug("getall2 size = %i", tmp.size());
    allKeys = new ArrayListEnumeration ( tmp );
    //LOG.debug("getall2 size = %i", ((ArrayListEnumeration&)allKeys).size());
}


void NoteChangesTracker::getModifications(unsigned long lastsynctime){

    SQLiteDriver driver(path);

    ArrayList tmp;
    StringBuffer query;
    query.sprintf("SELECT note_id FROM fun_note_state WHERE creation > %li AND updated_from_client = 0;", lastsynctime);
    driver.queryIndex(query, tmp);
    if (newKeys){
        delete newKeys; newKeys = NULL;
    }
    newKeys = new ArrayListEnumeration( tmp );
    LOG.debug("NoteCT: %s", query.c_str());
    tmp.clear();
    
    query.sprintf("SELECT note_id FROM fun_note_state WHERE changed > %li AND updated_from_client = 0;", lastsynctime);
    
    LOG.debug("NoteCT: %s", query.c_str());
    driver.queryIndex(query, tmp);
    if (updatedKeys){
        delete updatedKeys; updatedKeys = NULL;
    }
    updatedKeys = new ArrayListEnumeration( tmp );

    tmp.clear();
    query.sprintf("SELECT note_id FROM fun_note_state WHERE deleted > %li AND creation <= %li AND updated_from_client = 0;", lastsynctime, lastsynctime);
    LOG.debug("NoteCT: %s", query.c_str());

    driver.queryIndex(query, tmp);
    if (deletedKeys){
        delete deletedKeys; deletedKeys = NULL;
    }
    deletedKeys = new ArrayListEnumeration ( tmp );
}

